package pers.xiaojun.boot.module.system.dao.redis;

import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
import pers.xiaojun.boot.common.util.JsonUtils;
import pers.xiaojun.boot.module.system.constants.RedisKeyConstants;
import pers.xiaojun.boot.module.system.service.oauth2.dto.OAuth2TokenDTO;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.TimeUnit;

/**
 * Token缓存数据访问层
 *
 * @author xiaojun
 * @since 2025-10-08
 */
@Repository
@RequiredArgsConstructor
public class TokenRedisDAO {


    private final RedisTemplate<String, Object> redisTemplate;

    /**
     * 缓存 Token 信息
     *
     * @param oAuth2TokenDTO Token数据
     */
    @SneakyThrows
    public void save(OAuth2TokenDTO oAuth2TokenDTO) {
        redisTemplate.opsForValue().set(
                StrUtil.format(RedisKeyConstants.Token.USER_TOKEN, oAuth2TokenDTO.getAccessToken()),
                JsonUtils.toJson(oAuth2TokenDTO),
                LocalDateTimeUtil.between(LocalDateTime.now(), oAuth2TokenDTO.getExpiresTime(), ChronoUnit.SECONDS),
                TimeUnit.SECONDS
        );
    }

    /**
     * 获取缓存的Token数据
     *
     * @param token Token
     * @return {@link OAuth2TokenDTO}
     */
    public OAuth2TokenDTO get(String token) {
        Object redisObj = redisTemplate.opsForValue().get(StrUtil.format(RedisKeyConstants.Token.USER_TOKEN, token));
        return redisObj == null ? null : JsonUtils.fromJson((String) redisObj, OAuth2TokenDTO.class);
    }

    /**
     * 删除缓存的Token数据
     *
     * @param token Token
     */
    public void delete(String token) {
        redisTemplate.delete(token);
    }

}
